package com.microframework.boot.datarule.service;

import java.util.List;

import com.alibaba.fastjson2.JSONObject;
import com.jfinal.plugin.activerecord.Page;
import com.microframework.base.web.page.PageQuery;
import com.microframework.boot.datarule.model.domain.Rule;
import com.microframework.boot.datarule.model.domain.RuleCol;
import com.microframework.boot.datarule.model.response.RuleDTO;
import com.microframework.boot.datarule.model.response.TableMetaDTO;

public interface IRuleService {

	List<Rule> loadAll(PageQuery<Rule> pageQuery);

	TableMetaDTO executeSql(String sqlid) throws Exception;

	String generateFields(String id);

	Page<RuleCol> pages(PageQuery<RuleCol> pageQuery);

	RuleDTO getColumnsByRuleCode(String ruleCode);

	
	/**
	 * 根据数据规则执行动态保存（插入/更新）
	 * @param ruleCode 规则唯一标识（对应sys_rule表中的code字段）
	 * @param params   保存数据参数，支持多表级联操作，格式：
	 *                {
	 *                  // 主表数据（必须）
	 *                  "main_table": {
	 *                    "id": 123,               // 存在则更新，不存在则插入
	 *                    "name": "张三",
	 *                    "age": 25
	 *                  },
	 *                  // 从表数据（可选）
	 *                  "sub_table": [
	 *                    { "item_id": 1, "value": "A" },  // 数组表示批量操作
	 *                    { "item_id": 2, "value": "B" }
	 *                  ],
	 *                  // 控制参数（可选）
	 *                  "_option": {
	 *                    "ignoreNull": true,      // 是否忽略空值字段（默认false）
	 *                    "updateOnly": false      // 是否仅执行更新（默认false）
	 *                  }
	 *                }
	 * @return 操作结果消息，格式：
	 *         {
	 *           "code": 200,
	 *           "msg": "保存成功",
	 *           "data": {
	 *             "main_table": 1,    // 影响行数
	 *             "sub_table": 2
	 *           }
	 *         }
	 * @throws DataRuleException 当以下情况时抛出：
	 *         - 规则不存在(CODE:404)
	 *         - 数据校验失败(CODE:400)
	 *         - 违反唯一约束(CODE:409)
	 */
	String executeSaveByRuleCode(String ruleCode, JSONObject params);
	
	/**
	 * 根据规则代码执行动态查询
	 * @param ruleCode 规则唯一标识（对应sys_rule表中的code字段）
	 * @param params   查询参数（支持多级结构），格式：
	 *                {
	 *                  "pageNumber": 1,          // 可选，分页页码
	 *                  "pageSize": 10,           // 可选，分页大小
	 *                  "user": {"name": "张三"},  // 表字段参数
	 *                  "order": {"status": 1}     // 表字段参数
	 *                }
	 * @return 标准化JSON结果，结构：
	 *         {
	 *           "code": 200,
	 *           "msg": "success",
	 *           "data": [{...}],  // 查询结果列表
	 *           "page": {         // 仅分页查询时存在
	 *             "pageNumber": 1,
	 *             "pageSize": 10,
	 *             "totalCount": 100
	 *           }
	 *         }
	 * @throws DataRuleException 当规则不存在、SQL执行错误时抛出
	 */
	JSONObject executeQueryByRuleCode(String ruleCode, JSONObject params);
	
	/**
	 * 执行动态删除操作
	 * @param ruleCode 规则代码（SQL中必须包含WHERE条件）
	 * @param params   条件参数，格式：
	 *                {
	 *                  "id": 123,                // 直接参数
	 *                  "user": {                 // 表字段参数
	 *                    "deptId": "IT"          // 对应:user.deptId
	 *                  },
	 *                  "force": true             // 可选，强制删除标记
	 *                }
	 * @return 操作结果消息
	 * @throws DataRuleException 当尝试无条件删除时抛出
	 */
	String executeDeleteByRuleCode(String ruleCode, JSONObject params);

	/**
	 * 动态分页查询
	 * @param ruleCode 规则代码（需在sys_rule中配置分页SQL）
	 * @param params   必须包含分页参数，格式：
	 *                {
	 *                  "pageNumber": 1,          // 必须，页码从1开始
	 *                  "pageSize": 10,           // 必须，每页记录数
	 *                  "filter": {               // 可选，过滤条件
	 *                    "user.name": "张%",
	 *                    "age": [18, 30]         // 范围查询
	 *                  }
	 *                }
	 * @return 包含分页元数据的结果集
	 */
	JSONObject executePageByRuleCode(String ruleCode, JSONObject params);

}
